package com.cavy.platform.client.service;

//import com.github.dockerjava.api.DockerClient;
//import com.github.dockerjava.api.model.Event;
//import com.github.dockerjava.core.command.EventsResultCallback;

import lombok.extern.slf4j.Slf4j;

/**
 * Created by tangxu on 18-8-1.
 */
@Slf4j
public class DockerEventService
//        extends EventsResultCallback implements Runnable
{
//    public static final String EVENT_THREAD_NAME = "DockerEventHandler";
//    private static final String CONTAINER_NAME_KEY = "name";
//    private DockerClient dockerClient;
//    private EventsResultCallback exec;
//    private ConcurrentHashMap<String, DockerContainerStatus> map = new ConcurrentHashMap<>();
//
//    public DockerEventService(DockerClient dockerClient) {
//        this.dockerClient = dockerClient;
//    }
//
//    @Override
//    public void onNext(Event event) {
//        log.debug("事件:{}", event);
//        if (event == null || event.getActor() == null || event.getActor().getAttributes() == null ||
//                StringUtils.isEmpty(event.getActor().getAttributes().get(CONTAINER_NAME_KEY)) ||
//                !event.getActor().getAttributes().get(CONTAINER_NAME_KEY).startsWith(DockerServiceImpl.CONTAINER_PRE)) {
//            return;
//        }
//        if (StringUtils.isEmpty(event.getId())) {
//            return;
//        }
//        //|| isEvent(event, "stop") || isEvent(event, "kill")
//        if (isEvent(event, "die")) {
//            String id = event.getId();
//            DockerContainerStatus dockerContainerStatus = map.get(id);
//            if (dockerContainerStatus != null) {
//                dockerContainerStatus.stop();
//                String exitCode = event.getActor().getAttributes().get("exitCode");
//                dockerContainerStatus.setExitCode(exitCode);
//            } else {
//                map.put(id, new DockerContainerStatus().stop());
//            }
//        }
//        if (isEvent(event, "start")) {
//            String id = event.getId();
//            DockerContainerStatus dockerContainerStatus = map.get(id);
//            if (dockerContainerStatus != null) {
//                dockerContainerStatus.start();
//            } else {
//                map.put(id, new DockerContainerStatus().start());
//            }
//        }
//
//        if (isEvent(event, "destroy")) {
//            remove(event.getId());
//        }
//    }
//
//    private boolean isEvent(Event event, String die) {
//        return die.equals(event.getStatus());
//    }
//
//    public void init() {
//        Thread dockerEventHandler = new Thread(this);
//        dockerEventHandler.setName(EVENT_THREAD_NAME);
//        dockerEventHandler.setDaemon(true);
//        dockerEventHandler.start();
//    }
//
//    private void remove(String id) {
//        map.remove(id);
//    }
//
//    public void destroy() throws IOException {
//        exec.close();
//    }
//
//    public String waitContainerStop(String dockerContainerId) throws InterruptedException {
//        while (true) {
//            DockerContainerStatus dockerContainerStatus = map.get(dockerContainerId);
//            if (dockerContainerStatus != null && dockerContainerStatus.isEnd()) {
//                map.remove(dockerContainerId);
//                return dockerContainerStatus.getExitCode();
//            } else {
//                Thread.sleep(100);
//            }
//        }
//    }
//
//    public void printContainers() {
//        log.debug("====================map数量===================");
//        log.debug("=================={}=====================", map.size());
//        log.debug("=======================================");
//    }
//
//    @Override
//    public void run() {
//        exec = dockerClient.eventsCmd().withLabelFilter(DockerServiceImpl.CONTAINER_PRE).exec(this);
//        try {
//            exec.awaitCompletion();
//        } catch (InterruptedException e) {
//            Thread.currentThread().interrupt();
//            e.printStackTrace();
//        }
//    }
//
//    private class DockerContainerStatus {
//        private boolean start;
//        private boolean stop;
//        private String exitCode;
//
//        public DockerContainerStatus stop() {
//            this.stop = true;
//            return this;
//        }
//
//        public DockerContainerStatus start() {
//            this.start = true;
//            return this;
//        }
//
//        public boolean isEnd() {
//            return start && stop;
//        }
//
//        public String getExitCode() {
//            return exitCode;
//        }
//
//        public void setExitCode(String exitCode) {
//            this.exitCode = exitCode;
//        }
//    }
}
